home *** CD-ROM | disk | FTP | other *** search
/ The Best of Down Under Games / The Best of Down Under Games.iso / 3dfx Screen Savers / VoodooLights / Sources / cam.c next >
C/C++ Source or Header  |  1997-07-16  |  5KB  |  237 lines

  1. /*------------------------------------------------------/
  2. /                                                        /
  3. /    Copyright 1997, SΘrgio Durte <smd@di.fct.unl.pt>    /
  4. /                                                        /
  5. /------------------------------------------------------*/
  6.  
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <glide.h>
  10. #include <math.h>
  11.  
  12. #include <windows.h>
  13.  
  14. #include "defines.h"
  15. #include "mat.h"
  16. #include "hw.h"
  17. #include "cam.h"
  18. #include "rgb.h"
  19.  
  20. #define Border 1
  21.  
  22. #define xAspect 0.75
  23.  
  24. XYZ from, at, up ;
  25. static Float BackPlane = 1.0f , FrontPlane = 100.0f ;
  26. static Float focus ;
  27.  
  28. static Matrix Tw2c, R, Tcam, M, TMSper ;
  29.  
  30. static Bool newCamera = False ;
  31.  
  32. static void cam_M( Matrix M )
  33. {
  34.     Float zmin ;
  35.  
  36.     zmin = -( focus + FrontPlane )/( focus + BackPlane ) ;
  37.  
  38.     mat_idm( M ) ;
  39.  
  40.     M[2][2] = 1.0f / ( 1.0f + zmin ) ;
  41.     M[2][3] = -zmin / (1.0f + zmin ) ;
  42.     M[3][2] = -1.0f ;
  43.     M[3][3] =  0.0f ;
  44. }
  45.  
  46. void cam_WEyeDirection( XYZ *p, XYZ *eye )
  47. {
  48.     eye->x = p->x - from.x ;
  49.     eye->y = p->y - from.y ;
  50.     eye->z = p->z - from.z ;
  51. }
  52.  
  53. Bool cam_NewCamera( void )
  54. {
  55.     return newCamera ;
  56. }
  57.  
  58.  
  59. void cam_SetCamParameters( XYZ *f, XYZ *a, XYZ *u, Float df, Float front, Float back )
  60. {
  61.     from = *f ;
  62.     at = *a ;
  63.     up = *u ;
  64.  
  65.     mat_normalize( & up ) ;
  66.     
  67.     focus = df ;
  68.     BackPlane = back ;
  69.     FrontPlane = front ;
  70.  
  71.     newCamera = True ;
  72. }
  73. void cam_SetCamPosition( XYZ *f, XYZ *a, XYZ *u )
  74. {
  75.     from = *f ;
  76.     at = *a ;
  77.     up = *u ;
  78.  
  79.     mat_normalize( & up ) ;
  80.  
  81.     newCamera = True ;
  82. }
  83.  
  84. void cam_GetCamParameters( XYZ *f, XYZ *a, XYZ *u )
  85. {
  86.     *f = from ;
  87.     *a = at ;
  88.     *u = up ;
  89. }
  90.  
  91. static void cam_Rotation( Matrix R )
  92. {
  93.     XYZ rx, ry, rz ;
  94.     
  95.     mat_subv( & at, & from, & rz ) ;
  96.     mat_normalize( & rz ) ;
  97.  
  98.     mat_crossp( & up, & rz, & rx ) ; /* assuming up normalized */
  99.     
  100.     mat_crossp( &  rz, & rx, & ry ) ;
  101.  
  102.     R[0][0] = rx.x ; R[0][1] = rx.y ; R[0][2] = rx.z ; R[0][3] = 0.0f ;
  103.     R[1][0] = ry.x ; R[1][1] = ry.y ; R[1][2] = ry.z ; R[1][3] = 0.0f ;
  104.     R[2][0] = rz.x ; R[2][1] = rz.y ; R[2][2] = rz.z ; R[2][3] = 0.0f ;
  105.     R[3][0] = 0.0f ; R[3][1] = 0.0f ; R[3][2] = 0.0f ; R[3][3] = 1.0f ;
  106.  
  107.  
  108.  
  109. static void cam_scaleW( Matrix W )
  110. {
  111.     Float maxW = 1000.0f ;
  112.     
  113.     mat_idm( W ) ;
  114.     
  115.     W[0][0] = 1.0f ;
  116.     W[1][1] = 1.0f ;
  117.     W[2][2] = 1.0f ;
  118.     W[3][3] = maxW ;
  119.  
  120. void cam_BuildCameraTransform()
  121. {
  122.     Matrix Tfrom, Tprp, Sper, T1 ;
  123.     Matrix S, Twin ;
  124.  
  125.     XYZ p ;
  126.  
  127.     newCamera = False ;
  128.  
  129.     p.x = -from.x ;    p.y = -from.y ;    p.z = -from.z ;
  130.     mat_transl( & p, Tfrom ) ;
  131.  
  132.  
  133.     cam_Rotation( R ) ;
  134.  
  135.     mat_multm( R, Tfrom, T1 ) ;
  136.  
  137.     p.x = 0.0f ; p.y = 0.0f ; p.z = focus ;
  138.     mat_transl( & p, Tprp ) ;
  139.  
  140.  
  141.     mat_multm( Tprp, T1, Tcam ) ; 
  142.     
  143.     p.x = xAspect * focus / (focus + BackPlane ) ;
  144.     p.y = focus / (focus + BackPlane ) ;
  145.     p.z = -1.0f / (focus + BackPlane ) ;
  146.     mat_scale( & p, Sper ) ;
  147.  
  148.     cam_M ( M ) ;
  149.  
  150.     mat_multm( M, Sper, TMSper ) ;
  151.  
  152.     mat_multm( TMSper,  Tcam, Tw2c) ;
  153. }
  154.  
  155. void cam_W2P_XYZ( XYZ *p, XYZW *q )
  156. {
  157.   q->x = p->x * Tw2c[0][0] + p->y * Tw2c[0][1] + p->z * Tw2c[0][2] + Tw2c[0][3] ;
  158.   q->y = p->x * Tw2c[1][0] + p->y * Tw2c[1][1] + p->z * Tw2c[1][2] + Tw2c[1][3] ;
  159.   q->z = p->x * Tw2c[2][0] + p->y * Tw2c[2][1] + p->z * Tw2c[2][2] + Tw2c[2][3] ;
  160.   q->w = p->x * Tw2c[3][0] + p->y * Tw2c[3][1] + p->z * Tw2c[3][2] + Tw2c[3][3] ;
  161. }
  162.  
  163. void cam_W2C_XYZ( XYZ *p, XYZ *q )
  164. {
  165.   q->x = p->x * Tcam[0][0] + p->y * Tcam[0][1] + p->z * Tcam[0][2] + Tcam[0][3] ;
  166.   q->y = p->x * Tcam[1][0] + p->y * Tcam[1][1] + p->z * Tcam[1][2] + Tcam[1][3] ;
  167.   q->z = p->x * Tcam[2][0] + p->y * Tcam[2][1] + p->z * Tcam[2][2] + Tcam[2][3] ;
  168.  
  169. void cam_C2P_XYZ( XYZ *p, XYZW *q )
  170. {
  171.   q->x = p->x * TMSper[0][0] + p->y * TMSper[0][1] + p->z * TMSper[0][2] + TMSper[0][3] ;
  172.   q->y = p->x * TMSper[1][0] + p->y * TMSper[1][1] + p->z * TMSper[1][2] + TMSper[1][3] ;
  173.   q->z = p->x * TMSper[2][0] + p->y * TMSper[2][1] + p->z * TMSper[2][2] + TMSper[2][3] ;
  174.   q->w = p->x * TMSper[3][0] + p->y * TMSper[3][1] + p->z * TMSper[3][2] + TMSper[3][3] ;
  175.  
  176.  
  177. void cam_XYZW2Vertex( XYZW *Q, GrVertex *v )
  178. {
  179.     Float oow = 1.0 / Q->w ;
  180.  
  181.     v->x = SNAP_BIAS + Q->x * oow * (Float)(hw_ResXo2 - Border) + (Float)hw_ResXo2 ;
  182.  
  183.     v->y = SNAP_BIAS + Q->y * oow * (Float)(hw_ResYo2 - Border) + (Float)hw_ResYo2 ;
  184.  
  185.     v->oow = oow * M_1_65500 ;
  186. }
  187.  
  188. void cam_XYZWRGB2Vertex( XYZWRGB *Q, GrVertex *v )
  189. {
  190.     Float oow = 1.0 / Q->w ;
  191.  
  192.     v->x = SNAP_BIAS + Q->x * oow * (Float)(hw_ResXo2 - Border) + (Float)hw_ResXo2 ;
  193.  
  194.     v->y = SNAP_BIAS + Q->y * oow * (Float)(hw_ResYo2 - Border) + (Float)hw_ResYo2 ;
  195.  
  196.     v->oow = oow * M_1_65500 ;
  197.  
  198.     v->r = Q->r ; v->g = Q->g ; v->b = Q->b ;
  199. }
  200.  
  201. void cam_XYZWRGBST2Vertex( XYZWRGBST *Q, GrVertex *v )
  202. {
  203.     Float oow = 1.0 / Q->w ;
  204.  
  205.     v->x = SNAP_BIAS + Q->x * oow * (Float)(hw_ResXo2 - Border) + (Float)hw_ResXo2 ;
  206.  
  207.     v->y = SNAP_BIAS + Q->y * oow * (Float)(hw_ResYo2 - Border) + (Float)hw_ResYo2 ;
  208.  
  209.     v->oow = oow * M_1_65500 ;
  210.  
  211.     v->tmuvtx[0].sow = Q->s * v->oow ; 
  212.     v->tmuvtx[0].tow = Q->t * v->oow ;
  213.  
  214.     v->r = Q->r ; v->g = Q->g ; v->b = Q->b ;    
  215. }
  216.  
  217. void cam_XYZWRGBAST2Vertex( XYZWRGBAST *Q, GrVertex *v )
  218. {
  219.     Float oow = 1.0 / Q->w ;
  220.  
  221.     v->x = SNAP_BIAS + Q->x * oow * (Float)(hw_ResXo2 - Border) + (Float)hw_ResXo2 ;
  222.  
  223.     v->y = SNAP_BIAS + Q->y * oow * (Float)(hw_ResYo2 - Border) + (Float)hw_ResYo2 ;
  224.  
  225.     v->oow = oow * M_1_65500 ;
  226.  
  227.     v->tmuvtx[0].sow = Q->s * v->oow ; 
  228.     v->tmuvtx[0].tow = Q->t * v->oow ;
  229.  
  230.     v->r = Q->r ; v->g = Q->g ; v->b = Q->b ; v->a = Q->a ;
  231. }
  232.  
  233.